<?php
/**
 * @package PHP.aide + YEAP project
 * @name Storage Engine for ALL ;)
 * CRUD model
 *
 * @license GPL v.2
 * @copyright (cc) VS aka Virtual Stalker, 2009
 * 	call@2128506.su
 *
 * энжой! =;)
 * */



/**
 *	Класс сам по себе является датааксессором, сам себе оромом и включает драйвер бд
 *	попахивает god object, но это не так
 * */
include_once dirname(__FILE__).'/../StorageEngine.class.php';
include_once CLASS_PATH.'/Entity.class.php';

class EntityStorage extends StorageEngine
{
	function init()
	{	$this->setAccessor(new PDOAccessor());	}


	/**
	 * создание экземпляра сущности текущего эмм... класса\модуля
	 * возвращает всю коллекцию
	 * */
	public function & create($instance = null)	//	зачем параметр?
	{
		array_push($this->__spool, Entity::load($instance));

		return $this->__spool;
	}

	/**
	 * читает по хпач
	 * */
	function & read($xpath)
	{
		$r = $this->__accessor->run("SELECT * FROM _read('/{$this->__root}{$xpath}')");
//_log('READ-----------------',$r);
		if (isset($r[0]['id']))
			foreach ( $r as $a )
			{
				if (_isXML($a['data']))		//	костылёк-с
				{
					$obj = new $this->__type($a['data']) ;
					unset($obj[0]['id']);
					$obj->addAttribute('id',$a['id']);
					$this->__spool[$a['id']] = $obj;
				}
			}

		return $this->__spool;
	}

	/**
	 * обновление всех данных
	 *
	 * return кол-во обновлённых записей
	 * @TODO поправить _update() на возврат значения
	 * */
	function update(/*$xpath*/)
	{
		if (!is_array($this->__spool))
			return null;

//var_dump($this->__spool);
		$sql = '';
		$a = array();
		foreach ( $this->__spool as $k => $obj )
		{
			// утвердили форму: хмл, но почему-то в кавычках о_О
			if ($obj instanceof Entity)
				$a[] = "'". $obj->asXML() ."'";
		}
		$sql = 'ARRAY['.f_xml(implode(',',$a)).']';

		$r = $this->__accessor->query("SELECT _update($sql)"/*,array('data'=>$sql)*/);

		return $r ? $this->__accessor->rowCount() : $r ;	//	@TODO поправлено
	}

	/**
	 * удаляет быстро и беспощадно
	 * */
	function delete($xpath)
	{
		$r = $this->__accessor->query("SELECT _delete('{$xpath}')");
		return $r ? $this->__accessor->rowCount() : $r ;
	}


	/**
	 * специальные такие методы, всегда не хватает
	 * */
	function inc($xpath,$volume=1)
	{
		$r = $this->__accessor->query("SELECT _increment('{$xpath}',$volume)");
		return $r ? $this->__accessor->rowCount() : $r ;
	}
	function dec($xpath,$volume=1)
	{
		$r = $this->__accessor->query("SELECT _decrement('{$xpath}',$volume)");
		return $r ? $this->__accessor->rowCount() : $r ;
	}
	function increment($xpath,$volume=1)
	{	return $this->inc($xpath,$volume);	}
	function decrement($xpath,$volume=1)
	{	return $this->dec($xpath,$volume);	}

}
?>